iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
自我挑戰組

菜鳥AI工程師給碩班學弟妹的挑戰系列 第 11

[Day 11] pytorch lightning 實作 - 4

  • 分享至 

  • xImage
  •  

前情提要: 我們昨天花了很多時間把最後一段code補上,並且能正常訓練,以下來補補沒講到的部分。

1. ModelCheckpoint

這裡的ModelCheckpoint有蠻多參數的,以下這幾個是我常用的,會用這個的原因是因為,在pytorch的時候你甚麼時候要存checkpoint? 整個訓練完? 還是存評分最高的? 還是固定存後三個epoch? 不管是哪個pytorch都要自己用手寫的去判斷,那在lightning就是透過ModelCheckpoint來處理這些東西

  • save_top_k: 儲存前k個好的model下來,那甚麼是好的model? 這裡的好要搭配monitor + mode來看
  • monitor: 用哪一個數值來判別好壞,只要self.log裡面有的都可以,這裡是用valid_acc_epoch來儲存。
  • mode: 設定"max"代表數值越高越好

所以以上合在一起就是,我儲存valid_acc_epoch前五高的model

  • dirpath: model存放的路徑
  • filename: model要怎麼取名字,我自己習慣把valid_acc_epoch也加進來
  • save_last: 是否要儲存最後一個checkpoint

callbacks可以有多個,你可以同時用valid_acc_epoch和loss來儲存,甚至你有多種metrics,可以依照那些metrics來做。

    if task == 'train':
        callbacks = []
        dirpath = "./model"
        checkpoint_acc = ModelCheckpoint(
            save_top_k = 5,
            monitor = "valid_acc_epoch",
            mode = "max",
            dirpath = dirpath,
            filename = "model_{epoch:02d}_{valid_acc_epoch:.2f}",
            save_last = True,
        )
        callbacks.append(checkpoint_acc)
        trainer = pl.Trainer(
            max_epochs = max_epochs, 
            callbacks = callbacks, 
            gradient_clip_val = 2.0,
            # devices = [0, 1] # 多GPU訓練
        )  
        trainer.fit(model=model)

2. pl.Trainer

這個也是很多參數,可以看官方文檔來看要怎麼下,我自己用到的就這幾個:

  • max_epochs: 最多要訓練多少個epochs
  • callbacks: 就是剛才儲存ckpt的設定
  • gradient_clip_val: 計算梯度準備更新參數,把梯度限制在此設定數值當中,主要防止訓練資料有不優的資料,導致梯度非常大,一下子更新參數導致model壞掉,然後model逐漸發散,所以通常都會設定這個參數
  • devices: 可以設定做多GPU的使用
  • val_check_interval: 通常做validation_step是當訓練完一個epoch完之後才做,可以透過設定這個決定甚麼時候做validation_step,如果model是要訓練很久的話,通常或設定0.25,來觀察一下訓練的結果,如果不好或有問題就可以停止訓練。
    ex: val_check_interval = 0.25 # 在訓練時每0.25個epoch就做一次驗證
  • limit_val_batches: 假設你跑一個完整的val epoch需要100個batch,我設定limit_val_batches = 0.1,代表我只取10個batch的資料來跑
  • accumulate_grad_batches: 累積幾個batchs之後才更新模型參數,這個主要是應用在原先人家可能是用80G的記憶體batch size 256來訓練,但我們的機器可能只有24G, 16G, 12G,如果一樣設定256的話,記憶體會不夠,逼不得已只能降低batch size,但降低batch size可能會影響到model訓練的結果,所以這時就可以透過此參數,才達到相同的batch size來更新參數。

以上只是這次實作當中用到的,稍微做個簡單的說明,其實還有蠻多參數或函數沒有講解到,最後補充個EarlyStopping,雖然我自己本身沒用到,不過可以嘗試看看,簡單來說就是連續幾個epoch出來的結果,如果沒有比較好,那麼我就停止訓練,有點防止浪費時間的概念。

3. fine-tune

有時候我們用一些資料訓練出了一個不錯的model,此時如果有新增資料想要繼續訓練,或者使用人家的model來繼續訓練,通常稱之為fine-tune,此時可以透過以下方式,來將上次訓練完的參數載進來,接續著訓練。

        # 上面的部分省略跟train完全一樣
        ckpt_path = "/ws/code/Day8/model/last.ckpt"
        ckpt = torch.load(ckpt_path)["state_dict"]
        example.load_state_dict(ckpt)
        trainer.fit(model = example)

4. 資料集比例

在此範例當中,我們是直接拿人家已經分好train test的資料集來做訓練,那實際自己的資料如何分配比例呢??
分配比例之前我們要先知道資料集分成三種:

  1. train 訓練集: 訓練的資料集,比數一定最多,通常會再加data augmentation來增加模型的robust (魯棒性 強壯性,主要就是應用在各場景效果都不錯)
  2. eval(valid) 驗證集: 用於驗證訓練的結果,會跟train資料類似
  3. (outside) test 測試集: 用於測試任何場景,會跟train資料不類似

上面提到類似跟不類似,以及有個outside的詞,以下舉個例子:
假設我想做一個動物分類,此時我有狗狗,貓咪…
假設我的訓練集裡面都是柴柴的圖片,那麼驗證集也會是柴柴的圖片,只是跟訓練集裡面是"不同隻"柴柴,此時的outside test可能就是哈士奇"不同種類"的狗,那預期不管是柴柴還是哈士奇都是要標出狗狗的標籤,當你要應用模型的時候,一定是任何場景都會碰到,所以透過outside test來測試效果好不好。

最後比例分配有很多種

  1. 不包含測試集,且資料集較小 → 6:4, 7:3, 8:2
  2. 包含測試集,且資料集較小 → 6:3:1, 7:2:1
  3. 不包含測試集,且資料集較大(百萬筆資料): 99:1
  4. 包含測試集,且資料集較大(百萬筆資料): 98:1:1

在百萬筆資料大部分的比例都會給訓練,因為百萬的1%也已經夠多了,足以測出模型的性能,通常在文字方面百萬筆是很正常的。

今天就先更新到這囉~ 主要把一些觀念補上,後續也會把之前的觀念補上,並加上一些新東西。


上一篇
[Day10] pytorch lightning 實作 - 3
下一篇
[Day 12] loos 曲線
系列文
菜鳥AI工程師給碩班學弟妹的挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言